﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AccesoBD;
using Entidades;
using LogicaNegocio;
using Reportes;

namespace PresentacionEscritorio
{
    public partial class frmRegistrarCobroCuotas : Form
    {
        Afiliados af = new Afiliados();
        Cuota c = new Cuota();
        Cuotas cs = new Cuotas();
        Instituciones ins = new Instituciones();

        int id;
        long nroAf;
        DateTime d;
        string datos;
        int cantCuotasAdeudadas;
        Boolean ban = true;
        int idCuotaNvo;
        float importeNvo;
        DateTime fechaVencNva;
        DateTime vencimiento;
        bool tieneFechaPago;
        float suma = 0;
        float recargo = 0;
        float total = 0;
        float subtotal = 0;
        string totalEnLetras = "";
        bool?[] vector;
        int mes;
        int mes2;

        public frmRegistrarCobroCuotas()
        {
            InitializeComponent();
            cargarcmbTipoDoc();

        }

        private void frmRegistrarCobroCuotas_Load(object sender, EventArgs e)
        {
            cmbTipoDocumento.Enabled = false;
            txtNombreInstitucion.Enabled = false;
            txtNumeroDocumento.Enabled = false;
            txtRecargo.Enabled = false;
            cmbTipoDocumento.SelectedIndex = -1;
        }

        private void cargarcmbTipoDoc()
        {
            GestorTiposDocumento g = new GestorTiposDocumento();
            List<TipoDocumento> lista = g.obtenerTipoDocumento();

            if (lista != null)
            {
                cmbTipoDocumento.DataSource = lista;
                cmbTipoDocumento.ValueMember = "Codigo";
                cmbTipoDocumento.DisplayMember = "Nombre";
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            grdResultadoBúsquedaAfiliado.AllowUserToAddRows = false;
            if (rdbAfiliado.Checked == true)
            {
                ban = false;
                nroAf = af.BuscarNroAfiliadoTitular(Convert.ToInt64(txtNumeroDocumento.Text), Convert.ToInt32(cmbTipoDocumento.SelectedValue));
                if (nroAf != 0)
                {
                    d = cs.buscarUltimaFechaDePago(nroAf);
                    if (d.ToString() == "01/01/4000 00:00:00")
                    {
                        datos = cs.datosAfiliadoTitutlar(nroAf);

                        System.DateTime moment = new System.DateTime();
                        int mesActual = moment.Month;
                        vencimiento = cs.buscarFechaVencimiento(nroAf);
                        int mesUltimoPago = vencimiento.Month;
                        int m = vencimiento.Month;
                        int añoactual = DateTime.Now.Year;
                        int añoultimovencimiento = vencimiento.Year;
                        int calculoAños = añoactual - añoultimovencimiento;
                        cantCuotasAdeudadas = mesActual - m + (calculoAños * 12);
                        if (cantCuotasAdeudadas <= 0)
                        {
                            grdResultadoBúsquedaAfiliado.Rows.Add(nroAf, datos, "Sin cuotas pagas", "1");
                            tieneFechaPago = false;
                        }
                        else
                        {
                            vencimiento = cs.buscarFechaVencimiento(nroAf);
                            grdResultadoBúsquedaAfiliado.Rows.Add(nroAf, datos, "Sin cuotas pagas", cantCuotasAdeudadas);
                            tieneFechaPago = false;
                        }
                    }
                    else
                    {
                        datos = cs.datosAfiliadoTitutlar(nroAf);

                        vencimiento = cs.buscarFechaVencimiento(nroAf);
                        int mesActual = DateTime.Now.Month;
                        int mesUltimoPago = d.Month;
                        int m = vencimiento.Month;
                        int añoactual = DateTime.Now.Year;
                        int añoultimovencimiento = vencimiento.Year;
                        int calculoAños = añoactual - añoultimovencimiento;
                        cantCuotasAdeudadas = mesActual - m + (calculoAños * 12);
                        vencimiento = cs.buscarFechaVencimiento(nroAf);
                        grdResultadoBúsquedaAfiliado.Rows.Add(nroAf, datos, d, cantCuotasAdeudadas);
                        tieneFechaPago = true;
                    }


                }
                else
                {
                    MessageBox.Show("No se encuentra afiliado con los datos ingresados !");
                    cmbTipoDocumento.SelectedIndex = -1;
                    txtNumeroDocumento.Text = "";
                }
            }
            else
            {
                if (rdbInstitucion.Checked == true)
                {

                    id = ins.obtenerIdInstitucion(txtNombreInstitucion.Text);

                    if (id != 0)
                    {
                        d = cs.buscarUltimaFechaDePago2(id);
                        if (d.ToString() == "01/01/4000 0:00:00")
                        {

                            int mesActual = DateTime.Now.Month;
                            vencimiento = cs.buscarFechaVencimiento2(id);
                            int mesUltimoPago = vencimiento.Month;
                            int m = vencimiento.Month;
                            int añoactual = DateTime.Now.Year;
                            int añoultimovencimiento = vencimiento.Year;
                            int calculoAños = añoactual - añoultimovencimiento;
                            cantCuotasAdeudadas = mesActual - m + (calculoAños * 12);
                            if (cantCuotasAdeudadas <= 0)
                            {
                                grdResultadoBúsquedaAfiliado.Rows.Add(id, txtNombreInstitucion.Text, "Sin cuotas pagas", "1");
                                tieneFechaPago = false;
                            }
                            else
                            {
                                vencimiento = cs.buscarFechaVencimiento2(id);
                                grdResultadoBúsquedaAfiliado.Rows.Add(id, txtNombreInstitucion.Text, "Sin cuotas pagas", cantCuotasAdeudadas);
                                tieneFechaPago = false;
                            }
                        }
                        else
                        {


                            vencimiento = cs.buscarFechaVencimiento2(id);
                            int mesActual = DateTime.Now.Month;
                            int mesUltimoPago = d.Month;
                            int m = vencimiento.Month;
                            int añoactual = DateTime.Now.Year;
                            int añoultimovencimiento = vencimiento.Year;
                            int calculoAños = añoactual - añoultimovencimiento;
                            cantCuotasAdeudadas = mesActual - m + (calculoAños * 12);
                            vencimiento = cs.buscarFechaVencimiento(nroAf);
                            grdResultadoBúsquedaAfiliado.Rows.Add(id, txtNombreInstitucion.Text, d, cantCuotasAdeudadas);
                            tieneFechaPago = true;
                        }

                    }
                    else
                    {
                        MessageBox.Show("No se encuentra institucion con el nombre ingresado !");
                        txtNombreInstitucion.Text = "";
                    }
                }
                else MessageBox.Show("Seleccione Afiliado o Institución! ");
            }
        }

        private void btnSeleccionar_Click(object sender, EventArgs e)
        {
            dgvCuotasAfiliado.AllowUserToAddRows = false;
            if (grdResultadoBúsquedaAfiliado.SelectedRows.Count > 0)
            {
                string periodo = "";
                int nroAfiliado = Convert.ToInt32(grdResultadoBúsquedaAfiliado.CurrentRow.Cells["idAfiliado"].Value.ToString());
                int cuotasAdeudadas = Convert.ToInt32(grdResultadoBúsquedaAfiliado.CurrentRow.Cells["adeuda"].Value.ToString());
                if (ban == false)
                    c = cs.buscarUltimaCuotaAfiliado(nroAfiliado, vencimiento);
                else
                    c = cs.buscarUltimaCuotaAfiliado2(id, vencimiento);

                if (cuotasAdeudadas <= 0) MessageBox.Show("Cuenta al dia ! Próximo vencimiento : " + (c.fechaVencimiento).AddMonths(1).ToShortDateString());

                int j = 0;
                for (int i = 1; i <= cuotasAdeudadas; i++)
                {

                    if (tieneFechaPago)
                    {
                        mes = c.fechaVencimiento.Month + i;
                        mes2 = c.fechaVencimiento.Month + j;

                        if (c.fechaVencimiento.Month < 12 && mes2 < 12)
                        {
                            periodo = mes2 + " - " + mes;
                        }
                        else
                        {

                            periodo = j + "-" + i;

                        }
                        fechaVencNva = Convert.ToDateTime((c.fechaVencimiento).AddMonths(i).Date.ToString());
                        importeNvo = c.importe;
                        dgvCuotasAfiliado.Rows.Add(periodo, fechaVencNva.Date, importeNvo);
                        j++;

                    }
                    else
                    {
                        if (cantCuotasAdeudadas > 0)
                        {
                            mes = c.fechaVencimiento.Month + i;
                            mes2 = c.fechaVencimiento.Month + j;

                            if (c.fechaVencimiento.Month < 12 && mes2 < 12)
                            {
                                periodo = mes2 + " - " + mes;
                            }
                            else
                            {

                                periodo = j + "-" + i;

                            }
                            fechaVencNva = Convert.ToDateTime((c.fechaVencimiento).AddMonths(i).Date.ToString());
                            importeNvo = c.importe;
                            dgvCuotasAfiliado.Rows.Add(periodo, fechaVencNva.Date, importeNvo);
                            j++;
                        }
                        else
                        {

                            periodo = c.fechaVencimiento.Month - 1 + " - " + c.fechaVencimiento.Month;
                            importeNvo = c.importe;
                            dgvCuotasAfiliado.Rows.Add(periodo, vencimiento.Date, importeNvo);
                        }
                    }
                }

                vector = new bool?[dgvCuotasAfiliado.Rows.Count];
                for (int i = 0; i < vector.Length; i++)
                {
                    vector[i] = null;
                }
            }
            else
            {
                MessageBox.Show("Debe seleccionar un afiliado!", "Aviso", MessageBoxButtons.YesNo);
            }
        }

        private void btnRegistrarCobroCuota_Click(object sender, EventArgs e)
        {
            bool res = false;
            int contador = 0;
            if (txtTotalLetras.Text == "")
            {
                MessageBox.Show("Por favor ingrese total en letras");
            }

            else
            {
                //barby - creacion del recibo y sus detalles
                Recibo r = new Recibo();

                r.NroRecibo = RecibosCobroAtencionMedica.ObtenerUltimoNroRecibo() + 1;
                r.NroSerie = 1;
                r.Fecha = DateTime.Now;
                r.Subtotal = float.Parse(txtSubtotal.Text);
                if (txtRecargo.Text == "") r.Recargo = 0;
                else r.Recargo = float.Parse(txtRecargo.Text);
                r.Total = float.Parse(txtTotal.Text);
                r.TotalEnLetras = txtTotalLetras.Text;

                r.ApellidoNombrePaciente = datos;

                r.MisDetallesRecibo = new List<DetalleRecibo>();

                foreach (DataGridViewRow row in dgvCuotasAfiliado.Rows)
                {
                    if (Convert.ToBoolean(row.Cells["seleccionar"].Value))
                    {
                        contador++;
                        float precio = (float)Convert.ToDouble(dgvCuotasAfiliado.CurrentRow.Cells["Monto"].Value);
                        DateTime fecha = Convert.ToDateTime(row.Cells["FechaVencimiento"].Value).Date;
                        if (ban == false)
                        {
                            if (contador > 0)
                            {
                                res = cs.registrarCuota(nroAf, precio, fecha, r.NroRecibo);
                                r.nroAfiliado = nroAf;
                            }
                        }
                        else
                        {
                            if (contador > 0)
                            {
                                res = cs.registrarCuota2(id, precio, fecha, r.NroRecibo);
                                r.IdInstitucion = id;
                            }
                        }

                        DetalleRecibo dr = new DetalleRecibo();

                        dr.Concepto = " Cobro cuota periodo " + row.Cells["periodo"].Value.ToString();
                        dr.Monto = precio;
                        dr.NroRecibo = r.NroRecibo;
                        dr.NroSerieRecibo = r.NroSerie;

                        r.MisDetallesRecibo.Add(dr);
                    }
                }

                if (contador > 0)
                {
                    //registrar recibo y detalle
                    RecibosCobroAtencionMedica.RegistrarReciboCobroCuotas(r);
                }
                else MessageBox.Show("No existen cuotas para registrar un cobro");


                if (res)
                {
                    //agregamos el cobro a la caja
                    agregarCobroToCajaDiaria(r);

                    MessageBox.Show("Cobro con exito", "Aviso", MessageBoxButtons.YesNo);
                    totalEnLetras = txtTotalLetras.Text;
                    limpiar();
                }
                else
                {
                    MessageBox.Show("No se pudo registrar el cobro!", "Aviso", MessageBoxButtons.YesNo);
                }

                frmMostrarRecibo frm = new frmMostrarRecibo();
                frm.recibo = r;
                frm.ShowDialog();
            }
        }

        private void agregarCobroToCajaDiaria(Recibo reciboNuevo)
        {
            DetalleCajaDiaria detalle = new DetalleCajaDiaria();
            detalle.NroSerieRecibo = reciboNuevo.NroSerie;
            detalle.NroRecibo = reciboNuevo.NroRecibo;
            detalle.IdTipoMovimiento = 1;
            detalle.Monto = reciboNuevo.Total;
            detalle.Observaciones = "Cobro cuotas afiliado " + reciboNuevo.ApellidoNombrePaciente;
            
            detalle.IdCaja = ((frmMdiContainer)this.MdiParent).MiCaja.IdCaja;

            //guardamos el detalle_CajaDiaria en la bd
            GestorCaja gc = new GestorCaja();
            bool res = gc.registrarDetalleEnCaja(detalle);
            if (res)
            {
                //buscamos el id del detalle
                detalle.IdDetalleCajaDiaria = gc.obtenerUltimoIDDetalleEnCaja(detalle.IdCaja);

                //agregamos el detalle a la caja
                ((frmMdiContainer)this.MdiParent).MiCaja.DetallesCajaDiaria.Add(detalle);
            }
        }


        private void chkHabilitarRecargo_CheckedChanged(object sender, EventArgs e)
        {
            if (chkHabilitarRecargo.Checked)
                txtRecargo.Enabled = true;
            else
            {
                txtRecargo.Enabled = false;
                recargo = 0;
                txtRecargo.Text = "";
                calcularTotal();
            }

        }

        private void rdbAfiliado_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbAfiliado.Checked)
            {
                cmbTipoDocumento.Enabled = true;
                txtNombreInstitucion.Enabled = false;
                txtNumeroDocumento.Enabled = true;
            }
        }

        private void rdbInstitucion_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbInstitucion.Checked)
            {
                cmbTipoDocumento.Enabled = false;
                txtNombreInstitucion.Enabled = true;
                txtNumeroDocumento.Enabled = false;
            }
        }

        private void txtTotal_TextChanged(object sender, EventArgs e)
        {
            if (chkHabilitarRecargo.Checked)
            {
                recargo = (float)(Convert.ToInt32(txtRecargo.Text));
            }
            txtTotal.Text = Convert.ToString(suma + recargo);
        }

        private void calcularTotal()
        {
            total = subtotal + recargo; ;
            txtTotal.Text = total.ToString();
            suma = 0;
        }

        private void txtSubtotal_TextChanged(object sender, EventArgs e)
        {
            if (txtSubtotal.Text != "")
            {
                subtotal = float.Parse(txtSubtotal.Text);
                calcularTotal();
            }
        }

        private void txtRecargo_TextChanged(object sender, EventArgs e)
        {
            if (txtRecargo.Enabled && (!string.IsNullOrEmpty(txtRecargo.Text)))
            {
                recargo = float.Parse(txtRecargo.Text);
                calcularTotal();
            }
        }

        public void limpiar()
        {
            rdbAfiliado.Checked = false;
            rdbInstitucion.Checked = false;
            txtNombreInstitucion.Text = "";
            txtNombreInstitucion.Enabled = false;
            txtNumeroDocumento.Text = "";
            txtNumeroDocumento.Enabled = false;
            cmbTipoDocumento.SelectedIndex = -1;
            cmbTipoDocumento.Enabled = false;
            grdResultadoBúsquedaAfiliado.Rows.Clear();
            dgvCuotasAfiliado.Rows.Clear();
            txtRecargo.Text = "";
            txtSubtotal.Text = "";
            txtTotal.Text = "";
            chkHabilitarRecargo.Checked = false;
            recargo = 0;
            subtotal = 0;
            total = 0;
            suma = 0;
            ban = true;
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            limpiar();
        }

        private void txtNumeroDocumento_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < vector.Length; i++)
            {
                if (vector[i] == true)
                {
                    suma += (float)(Convert.ToDouble(dgvCuotasAfiliado.Rows[i].Cells["Monto"].Value));
                }
            }
            txtSubtotal.Text = Convert.ToString(suma);
        }

        private void dgvCuotasAfiliado_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvCuotasAfiliado.CurrentRow.Cells[e.ColumnIndex].OwningColumn == dgvCuotasAfiliado.Columns["seleccionar"])
            {
                if (vector[e.RowIndex] == null)
                {
                    vector[e.RowIndex] = true;
                }
                else
                {
                    if (vector[e.RowIndex] == true)
                    {
                        vector[e.RowIndex] = false;
                    }
                    else
                    {
                        if (vector[e.RowIndex] == false)
                        {
                            vector[e.RowIndex] = true;
                        }
                    }
                }
            }
        }
    }
}
